✨코로나19 오픈 API로 배우는 파이썬 및 데이터 시각화✨

공공데이터포털에서 제공하는 보건복지부 코로나19 현황 오픈 API를 활용하여 API 사용법, Pandas DataFrame, 데이터 시각화를 알아보도록 하겠습니다.

01장. API 사용법 익히기

02장. xml 포맷을 Pandas DataFrame으로 변환하기

03장. Pandas DataFrame 다루기

04장. 코로나19 현황 웹사이트 시각화 따라하기 | 현재글

04장에서는 API로 획득한 데이터를 plotly로 시각화하는 방법을 알아보겠습니다.

API로 데이터 불러오기 (01장. 참조)

보건복지부 코로나19 감염 현황 오픈API는 국내 코로나19 첫 환자 발생일인 2020년 1월 20일이 아닌 [2020-01-01, 2020-02-02 ~ 진행중] 기간의 데이터를 제공합니다.

[2020-01-01 ~ 2020-03-01] 기간의 데이터는 결측치가 존재하여 [2020-03-02 ~ 진행중] 기간에 대한 데이터를 사용합니다.

import requests
from bs4 import BeautifulSoup as bs
from urllib import parse
import pandas as pd

from datetime import datetime
today = datetime.now().strftime('%Y%m%d') # datetime 라이브러리를 통해 현재 날짜 today 생성

serviceKey = 'API 일반 인증키' # 공공데이터포털에서 발급받은 서비스키
params = {'ServiceKey':parse.unquote(serviceKey), # 서비스키(필수)
          'startCreateDt':20200302,
          'endCreateDt':today # 데이터 생성일 종료범위(선택) - today(현재 날짜 입력)
# 서비스URL
url = 'http://openapi.data.go.kr/openapi/service/rest/Covid19/getCovid19InfStateJson?'

res = requests.get(url, params=params)
soup = bs(res.text, 'lxml')

xml을 DataFrame으로 변환하기 (02장. 참조)

items = soup.find_all('item')

dic1 = dict(covid19=[])

for item in items:
    dic = {}
    for x in item:
        if x.name in set(response):
            dic[x.name] = x.text
    dic1['covid19'].append(dic)

# DataFrame으로 변환
df = pd.DataFrame(dic1['covid19'])
df.columns = df.columns.map(response) # column명에 map함수를 적용하여 한글로 변환

Plotly로 따라하는 Coronaboard.kr 국내차트 시각화

국내 및 전세계 코로나19 실시간 상황판을 제공하는 CoronaBoard에서 제공하는 국내차트 대한민국 코로나19 추이 일별 막대그래프를 그려보도록 하겠습니다.

데이터(csv) 불러오기

# plotly 설치
!pip install plotly

import plotly.graph_objects as go
import plotly.express as px
from plotly.subplots import make_subplots

# 저장한 csv파일 불러오기
data = pd.read_csv('../data/corona.csv')
# 기준일 data type 날짜로 변환
data.기준일 = data.기준일.apply(pd.to_datetime)
data

대한민국 코로나19(COVID-19) 추이

기본 막대 그래프

df = data.copy()
df = df[df.기준일.dt.month == 12].sort_values('기준일') # 12월 기준일 오름차순 정렬

fig = go.Figure()
# 확진 그래프
fig.add_trace(go.Bar(x=df.기준일.dt.strftime('%m.%d'), 
                     y=df.일확진자, 
                     text=df.일확진자, # 그래프 위 확진 수 보이게 하기
                     textposition='outside', # text 위치
                     hovertemplate='기준일: %{x} <br>확진: %{y}명', 
                     name='확진'
                    )
             )
# 사망 그래프
fig.add_trace(go.Bar(x=df.기준일.dt.strftime('%m.%d'), 
                     y=df.일사망자, 
                     text=df.일사망자, # 그래프 위 사망 수 보이게 하기
                     textposition='outside', # text 위치
                     hovertemplate='기준일: %{x} <br>사망: %{y}명',
                     name='사망'
                    )
             )
# 격리해제 그래프
fig.add_trace(go.Bar(x=df.기준일.dt.strftime('%m.%d'), 
                     y=df.일격리해제, 
                     text=df.일격리해제, # 그래프 위 격리해제 수 보이게 하기
                     textposition='outside', # text 위치
                     hovertemplate='기준일: %{x} <br>격리해제: %{y}명',
                     name='격리해제'
                    )
             )
fig.update_layout(xaxis=dict(type='category'), # x축 모든 날짜 보이게 하기
                  title_text='대한민국 코로나18(COVID-19) 추이 - 2020.12' # 그래프 제목
                 )
fig.show()

막대 그래프 + Range Slider(날짜 범위 선택)

df = data.copy()
df = df[(df.기준일.dt.month == 11)|(df.기준일.dt.month == 12)].sort_values('기준일') # 11월~12월 기준일 오름차순 정렬

fig = go.Figure()
# 확진 그래프
fig.add_trace(go.Bar(x=df.기준일, # 기본 그래프와 달리 '2020-12-01' 날짜 포맷 그대로 입력
                     y=df.일확진자, 
                     text=df.일확진자, # 그래프 위 확진 수 보이게 하기
                     textposition='outside', # text 위치
                     hovertemplate='기준일: %{x} <br>확진: %{y}명', 
                     name='확진'
                    )
             )
# 사망 그래프
fig.add_trace(go.Bar(x=df.기준일, # 기본 그래프와 달리 '2020-12-01' 날짜 포맷 그대로 입력
                     y=df.일사망자, 
                     text=df.일사망자, # 그래프 위 사망 수 보이게 하기
                     textposition='outside', # text 위치
                     hovertemplate='기준일: %{x} <br>사망: %{y}명',
                     name='사망'
                    )
             )
# 격리해제 그래프
fig.add_trace(go.Bar(x=df.기준일, # 기본 그래프와 달리 '2020-12-01' 날짜 포맷 그대로 입력
                     y=df.일격리해제, 
                     text=df.일격리해제, # 그래프 위 격리해제 수 보이게 하기
                     textposition='outside', # text 위치
                     hovertemplate='기준일: %{x} <br>격리해제: %{y}명',
                     name='격리해제'
                    )
             )
fig.update_layout(xaxis=dict(type='category'),
                  title_text='대한민국 코로나18(COVID-19) 추이 - 2020.06~2020.12' # 그래프 제목
                 )
# Range Slider 추가
fig.update_layout(
    xaxis=dict(
        rangeselector=dict(
            buttons=list([
                dict(count=7, # day기준 7일 = 1week
                     label="1w",
                     step="day", 
                     stepmode="backward"),
                dict(count=14, # day기준 14일 = 2week
                     label="2w", 
                     step="day",
                     stepmode="backward"),
                dict(count=1, # month기준 1달 = 1month
                     label="1m",
                     step="month",
                     stepmode="backward"),
                dict(step="all")
            ])
        ),
        rangeslider=dict(
            visible=True
        ),
        type="date"
    )
)

# 기간 초기값 설정
initial_range = ['2020-11-30', '2020-12-15']
fig.update_layout(xaxis=dict(range=initial_range))

fig.show()

1w, 2w, 1m, 2m, all 버튼으로 그래프 기간 범위 선택이 가능합니다.
아래의 슬라이드는 다른 기간으로 이동이 가능하며 수동으로 기간 범위를 늘이고 줄일수 있습니다.

🌟 공공데이터 포털 오픈API를 활용해 DataFrame으로 변환하여 데이터 탐색 및 시각화를 통해 나만의 분석을 시작할 수 있습니다 !! 🌟